library(readxl)
library(httr)
library(arules)
library(tidyr)
library(dplyr)
library(lubridate)
library(stringr)
library(ggplot2)
library(purrr)
library(broom)
library(tibble)
library(plotly)
library(gridExtra)
Odczyt danych przeprowdzony jest bezośrednio ze strony, aby zapewenić stałą wartość początkową dla każdego uruchomienia. Dodatkowo uzupełniane są brakujące dane identyfikatory pacjentów PATIENT_ID. Wartości brakujące wynikają ze sposobu przetwarzania scalonych komórek pliku źródłowego.
# https://stackoverflow.com/a/41368947
url <- "http://www.cs.put.poznan.pl/dbrzezinski/teaching/zed/wuhan_blood_sample_data_Jan_Feb_2020.xlsx"
GET(url, write_disk(tf <- tempfile(fileext = ".xlsx")))
df <- read_excel(tf) %>% fill(PATIENT_ID)
Surowy zbiór danych zawiera 81 atrybutów i 6120 wierszy.
Atrybuty zbioru danych można potwierdzić na dwie grupy:
Poza danymi niedostępnymi (NA) w zbiorze danych wsytępują dane brakujące, oznakowane wartością -1. Poniższa tabela pokazuje ilość takich wartości w każdej kolumnie, o ile te wartości występują.
| name | n |
|---|---|
| 2019-nCoV nucleic acid detection | 501 |
| Platelet count | 4 |
Dla kolumny Platelet count warkości brakujących jest mało, liczby -1 zostaną zamienione na NA.
df <- df %>% mutate(`Platelet count` = if(is.na(`Platelet count`) || `Platelet count` != -1) `Platelet count` else NA)
Dla kolumny 2019-nCoV nucleic acid detection sprawdzimy całkowitą ilość wartości różnych od NA.
| name | n |
|---|---|
| 2019-nCoV nucleic acid detection | 501 |
Wszystkie wartości w kolumnie 2019-nCoV nucleic acid detection różne od NA wynoszą -1, w związku z tym ta kolumna jest właściwie nieprzydatna. Mimo to na ten moment postanowiono nie zmieniać wartości w tej kolumnie, ewentualne zmiany można wykonać w dalszych krokach.
Pierwszych siedem kolumn to atrybuty ogólne, reprezentują następująco:
Nazwy wyżej wymienionych atrybutów zostaną przeformatowane, będą pisane wielkimi literami, a ewentualne spacje będą zamieniane na znak podkreślinka _, w ten sposób atrbuty ogólne będą łatwo odróżnialne od pozostałych atrybutów.
df <- df %>% rename_with(~ toupper(gsub(" ", "_", .x, fixed = TRUE)), 1:7)
Pola GENDER i OUTCOME zostaną dodatkowo zmienione na typ factor - z typu numerycznego zamienione zostaną na zmienne nominalne. Do tego trzeba przeprowadzić identyfikację typu płci.
Wartości płci nie są jawnie opisane, w artykule źródłowym została natomiast podana proporcja pacjentów danej płci, co powinno umożliwić okreslenie właściwego przypisania.
| GENDER | count |
|---|---|
| 1 | 224 |
| 2 | 151 |
Wniosek:
12df <- df %>%
mutate(across("GENDER", ~factor(., levels=c(1,2), labels=c("MALE", "FEMALE")))) %>%
mutate(across("OUTCOME", ~factor(., levels=c(0,1), labels=c("CURED","DECEASED"))))
Poniżej można zapoznać się z analizą wartości dla atrybutów ogólnych. Wartość atrybutu RE_DATE ma unikalną wartość dla kazdego wiersza.
| RE_DATE | |
|---|---|
| Min. :2020-01-10 19:45:00 | |
| 1st Qu.:2020-02-04 13:44:00 | |
| Median :2020-02-09 12:42:30 | |
| Mean :2020-02-08 07:00:02 | |
| 3rd Qu.:2020-02-13 10:34:00 | |
| Max. :2020-02-18 17:49:00 | |
| NA’s :14 |
Pozostałe z atrybtów ogólnych, są wspólne dla każdego pacjenta, zastosowano transformację do zniwelowania skutków duplikacji.
| PATIENT_ID | AGE | GENDER | ADMISSION_TIME | DISCHARGE_TIME | OUTCOME | |
|---|---|---|---|---|---|---|
| Min. : 1.0 | Min. :18.00 | MALE :224 | Min. :2020-01-10 15:52:20 | Min. :2020-01-23 09:09:23 | CURED :201 | |
| 1st Qu.: 94.5 | 1st Qu.:46.00 | FEMALE:151 | 1st Qu.:2020-02-01 19:27:40 | 1st Qu.:2020-02-11 13:39:21 | DECEASED:174 | |
| Median :188.0 | Median :62.00 | Median :2020-02-04 22:30:34 | Median :2020-02-16 17:40:07 | |||
| Mean :188.0 | Mean :58.83 | Mean :2020-02-04 20:13:51 | Mean :2020-02-15 16:42:59 | |||
| 3rd Qu.:281.5 | 3rd Qu.:70.00 | 3rd Qu.:2020-02-10 04:11:10 | 3rd Qu.:2020-02-19 11:47:14 | |||
| Max. :375.0 | Max. :95.00 | Max. :2020-02-17 21:30:07 | Max. :2020-03-04 16:21:51 |
Liczba unikatowych identyfikatorów pacjentów wynosi 375.
Pozostałe 74 kolumn zawiera wartości atrybutów, które reprezentują rodzaje miar zebranych podczas każdego badania.
Nazwy kolumn zostały poddane następującym transformacjom:
(%) zamieniono na suffix _percent(#) usunięto i myślnika - zamieniono na podkreślenie dolne _ ze względu na łatwość odwołania się do kolumnPoniższy blok kodu szczegółowo ukazuje zatosowane transfomrmacje, jednocześnie prezentowana są ostatenczne nazwy kolumn wyników badań.
df <- df %>%
rename("NT-proBNP" = "Amino-terminal brain natriuretic peptide precursor(NT-proBNP)") %>%
rename("2019-nCov-detection" = "2019-nCoV nucleic acid detection") %>%
rename("aPPT" = "Activation of partial thromboplastin time") %>%
rename("ALP" = "Alkaline phosphatase") %>%
rename("AAT" = "aspartate aminotransferase") %>%
rename("FDPs" = "Fibrin degradation products") %>%
rename("ALT" = "glutamic-pyruvic transaminase") %>%
rename("hs-CRP" = "High sensitivity C-reactive protein") %>%
rename("hs-cTnI" = "Hypersensitive cardiac troponinI") %>%
rename("HCV-abs-quant" = "HCV antibody quantification") %>%
rename("HIV-abs-quant" = "HIV antibody quantification") %>%
rename("INR" = "International standard ratio") %>%
rename("LDH" = "Lactate dehydrogenase") %>%
rename("MCH" = "mean corpuscular hemoglobin") %>%
rename("MCHC" = "mean corpuscular hemoglobin concentration") %>%
rename("MCV" = "mean corpuscular volume") %>%
rename("MPV" = "Mean platelet volume") %>%
rename("P-LCR" = "platelet large cell ratio") %>%
rename("PDW" = "PLT distribution width") %>%
rename("q-t-pallidum-abs" = "Quantification of Treponema pallidum antibodies") %>%
rename("RCDW-SD" = "RBC distribution width SD") %>%
rename("RBC_count" = "Red blood cell count") %>%
rename("RCDW" = "Red blood cell distribution width") %>%
rename("TNF-alfa" = "Tumor necrosis factorα") %>%
rename("WBC_count" = "White blood cell count") %>%
rename("gamma-GT" = "γ-glutamyl transpeptidase") %>%
rename_with(~str_c(str_replace(.x, "\\(%\\)", ""), "_percent"), contains("(%)")) %>%
rename_with(~str_replace(.x, "\\(#\\)", "")) %>%
rename_with(tolower, matches("^[[:upper:]]{1}[[:lower:]]+", ignore.case = FALSE)) %>%
rename_with(~str_replace_all(.x, "[ |-]", "_"))
str_sort(colnames(df[,-(1:7)]))
## [1] "2019_nCov_detection" "AAT" "albumin"
## [4] "ALP" "ALT" "antithrombin"
## [7] "aPPT" "basophil_count" "basophil_percent"
## [10] "calcium" "corrected_calcium" "creatinine"
## [13] "D_D_dimer" "direct_bilirubin" "eGFR"
## [16] "eosinophil_count" "eosinophils_percent" "ESR"
## [19] "FDPs" "ferritin" "fibrinogen"
## [22] "gamma_GT" "globulin" "glucose"
## [25] "HBsAg" "HCO3_" "HCV_abs_quant"
## [28] "hematocrit" "hemoglobin" "HIV_abs_quant"
## [31] "hs_CRP" "hs_cTnI" "indirect_bilirubin"
## [34] "INR" "interleukin_10" "interleukin_1β"
## [37] "interleukin_2_receptor" "interleukin_6" "interleukin_8"
## [40] "LDH" "lymphocyte_count" "lymphocyte_percent"
## [43] "MCH" "MCHC" "MCV"
## [46] "monocytes_count" "monocytes_percent" "MPV"
## [49] "neutrophils_count" "neutrophils_percent" "NT_proBNP"
## [52] "P_LCR" "PDW" "PH_value"
## [55] "platelet_count" "procalcitonin" "prothrombin_activity"
## [58] "prothrombin_time" "q_t_pallidum_abs" "RBC_count"
## [61] "RCDW" "RCDW_SD" "serum_chloride"
## [64] "serum_potassium" "serum_sodium" "thrombin_time"
## [67] "thrombocytocrit" "TNF_alfa" "total_bilirubin"
## [70] "total_cholesterol" "total_protein" "urea"
## [73] "uric_acid" "WBC_count"
Niniejsza sekcja jest poświęcona wstępnemu przetwarzniu zbiorów danych, ze szczególnym uwzględnieniem usuwania i scalania wybranych rekordów.
W powyższej głównej zauważono wystąpienia wartości brakujących dla kolumny RE_DATE. Szybkie sprawdzenie wykazuje, że dla wierszy, gdzie nie ma atrybut RE_DATE przyjmuje wartość ‘NA’, wartości wszystkich atrybutów pochodzących z badań krwi, również przyjmują wartość ‘NA’.
all(sapply(df[is.na(df$RE_DATE), -c(1,3:7)], is.na))
## [1] TRUE
Fakt, że wiersze te są właściwie puste, jest podstawą do ich usunięcia ze zbioru.
df <- df[!is.na(df$RE_DATE),]
Po tej zmianie w zbiorze pozostało 6106 wierszy i 361 unikalnych identyfikatorów pacjentów.
Wstępnę analiza danych sugeruje wskazuje, że wiele wartości atrybutów jest oznaczona wartością ‘NA’. Poniższy wykresy wskazuje, ilość wystąpień rekordów badań z danę liczbą wartości (różnych od NA).
Z powyższego histogramu można wyciągnąć kilka wniosków
W poprzedniej sekcji stwierdzono, że można przeanalizować współwystępowanie ze sobą poszczególnych atrybutów w rekordach. W związku z tym tabela wyników badań zostanie przekształcona do zbioru binarnych transakcji.
transactions <- sapply(df[,-(1:7)], function(x) !is.na(x))
Sprawdzona zostanie ilość unikalnych transakcji.
length(unique(apply(transactions, 1, function(x) which(x))))
## [1] 176
W zbiorze 6106 transakcji jest zaledwie 176 różnych typów.
Aby sprawdzić, czy atrybuty wsytępują w grupach, wyszukiwane są maksymalne domknięte zbiory częste, dla mimalnej wartości support równej 5%.
itemsets <- apriori(transactions, parameter = list(target="closed frequent itemsets", support=.05, minlen=1, maxlen=30, maxtime=60))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## NA 0.1 1 none FALSE TRUE 60 0.05 1
## maxlen target ext
## 30 closed frequent itemsets TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 305
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[74 item(s), 6106 transaction(s)] done [0.01s].
## sorting and recoding items ... [63 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 done [27.59s].
## filtering closed item sets ... done [16.13s].
## sorting transactions ... done [0.00s].
## writing ... [130 set(s)] done [0.33s].
## creating S4 object ... done [1.01s].
mc_itemsets <- itemsets[is.maximal(itemsets)]
inspect(sort(mc_itemsets, by = 'support'))
## items support transIdenticalToItemsets count
## [1] {hemoglobin,
## eosinophils_percent,
## basophil_percent,
## platelet_count,
## monocytes_percent,
## RCDW,
## neutrophils_percent,
## MCV,
## hematocrit,
## WBC_count,
## MCHC,
## lymphocyte_count,
## RBC_count,
## eosinophil_count,
## neutrophils_count,
## MPV,
## RCDW_SD,
## lymphocyte_percent,
## P_LCR,
## monocytes_count,
## PDW,
## basophil_count,
## MCH,
## thrombocytocrit} 0.13609564 0.1354406 831
## [2] {glucose} 0.12692434 0.0000000 775
## [3] {serum_chloride,
## ALP,
## albumin,
## total_bilirubin,
## indirect_bilirubin,
## total_protein,
## urea,
## corrected_calcium,
## serum_potassium,
## direct_bilirubin,
## total_cholesterol,
## AAT,
## uric_acid,
## HCO3_,
## calcium,
## LDH,
## globulin,
## gamma_GT,
## hs_CRP,
## serum_sodium,
## ALT,
## eGFR,
## creatinine} 0.11021946 0.1094006 673
## [4] {hs_cTnI} 0.08303308 0.0000000 507
## [5] {2019_nCov_detection} 0.08205044 0.0000000 501
## [6] {NT_proBNP} 0.07779234 0.0000000 475
## [7] {procalcitonin} 0.07517196 0.0000000 459
## [8] {PH_value} 0.06288896 0.0000000 384
## [9] {ESR} 0.06272519 0.0000000 383
## [10] {prothrombin_time,
## antithrombin,
## prothrombin_activity,
## fibrinogen,
## thrombin_time,
## D_D_dimer,
## FDPs,
## INR,
## aPPT} 0.05371765 0.0000000 328
Otrzymaliśmy 10 maksymalnych domkniętych zbiorów częstych, z czego 7 to zbiory jednolementowe. Pozostałe 3 zbiory (1, 3 i 10) zawierają wiele elementów. Na podstawie elementów składowych, zbiory wieolemelemnetowe zostały zakwalifikowane następująco:
Na podstawie uzyskanego wyniku można wnioskować, że ilość elementów w rekordzie może wynikać z procesu technologicznego analizowania próbek krwi. Sugeruje to, że możliwe będzie scalanie rekordów, np na podstawie dnia wykonania badania (jeśli jednemu pacjentowi przeprowadzono wiele badań w ciagu dnia).
W tej sekcji przeprowadzona zostanie analiza występowania badań w czasie. Ponadto rekordy zostaną pogrupowane według przynależności do zbiorów wyznaczonych w poprzedniej sekcji oraz dwóch dodatkowych klas NONE jeśli rekord nie należy do żadnej kategorii i MULTIPLE jeśli rekod należy do więcej niż jednej kategorii.
Poniższe blok kodu generuje oetykietowany zbiór rekordów badań, ograniczony jedynie do podstawowych informacji.
class_labels <- as(items(sort(mc_itemsets, by="support")), "list")
class_labels <- sapply(class_labels, function(x) x[1])
class_labels[1] <- "Complete blood count"
class_labels[3] <- "Blood biochemistry"
class_labels[10] <- "Coagulation"
classes <- as(items(sort(mc_itemsets, by="support")), "matrix")
labeled <- df %>% rowwise() %>%
mutate(CLASS = paste(
which(
apply(
(matrix(
!is.na(c_across(-(1:7))),
nrow=nrow(classes),
ncol=ncol(classes),
byrow=TRUE,
dimnames=dimnames(classes)
) & classes) == classes,
1,
all)
), collapse=""),
.after=OUTCOME ) %>%
mutate(CLASS = if(CLASS != "" && as.integer(CLASS)>10) "MULTIPLE" else CLASS) %>%
mutate(CLASS = if(CLASS != "" && CLASS != "MULTIPLE") class_labels[as.integer(CLASS)] else CLASS) %>%
mutate(CLASS = str_replace(CLASS, "^$", "NONE")) %>%
mutate(CLASS = str_trim(CLASS)) %>%
mutate(CLASS = factor(CLASS)) %>%
rowwise() %>%
mutate(SIZE = sum(!is.na(c_across(-c(1:8)))), .after=CLASS) %>%
select(1:9) %>%
ungroup()
knitr::kable(
labeled %>% group_by(CLASS) %>% summarize(count = n(), .groups="drop") %>% arrange(desc(count))
)
| CLASS | count |
|---|---|
| NONE | 1433 |
| Complete blood count | 816 |
| glucose | 584 |
| Blood biochemistry | 507 |
| 2019_nCov_detection | 500 |
| MULTIPLE | 485 |
| hs_cTnI | 386 |
| PH_value | 375 |
| ESR | 368 |
| Coagulation | 300 |
| NT_proBNP | 190 |
| procalcitonin | 162 |
Powyższa tabela prezentuje ilość rekordów przydzielonych do każdej z klas.
Poniższy wykres prezentuje badania danej kategorii według daty wykonania. Dodatkowo każdy punkt jest opisany identyfikatorem pacjenta.
Z powyższego wykresu można wywnioskować kilka rzeczy:
RE_DATE. Biorąc pod uwagę fakt, że takie punkty najcześciej przynależą do różnych pacjentów i do tej samej kategorii, należy wnioskować, że poszczególne rodzaje badań były wykonywane równolegle dla wielu pacjentów.Jednocześnie nie znaleziono żadnych czynników, które podważają sens scalania rekordów.
Kolejna analiza dotyczy ilości różnych atrybutów zbadanych u każdego pacjenta. W tym celu wyznaczamy wektor wartości ostatnich badań każdego z pacjentów, tj wynik każdego badania jest najmłodszy i różny od NA, jeśli dany pacjent nie ma przypisanego żadnego rekordu zawierajacego wartość danego atrybutu, to wartość ta nadal będzie oznakowana jako NA.
Powyższy histogram obrazuje rozkład ilości badań wykonanych pacjentom. Zauważalna jest grupa wartości odstających - pacjentów którym wykonano znacząco mniej rodzajów badań. Rekordy tych pacjentów zostaną usunięte ze zbioru danych.
W celu usunięcia pacjentów z mniejszą ilością badań, zostanie wyznaczony próg minimlanej ilości badań. Próg ten przyjmuje wartość między 0 a 1, należy go interpretować jako minimalną procentową ilość badań, które musi mieć wykonany pacjent. Maksimum stanowi ilość wszystkich badanych atrybutów, czyli 74.
Wartość progu została wyznaczona analitycznie, w następujący sposób; dla każdej wartości progu z zakresu od 0.5 do 1 z krokiem 0.025, wyznaczona został procent pozostałych (nie odrzuconych) pacjentów, w stosunku do liczby początkowej, a także procent kolumn, które nie zawierają żadnej wartości NA.
Uzyskane dane zostały przedstawione na poniższym wykresie.
Wybrana wartość została oznaczona na wykresie czarną przerywaną linią, wynosi 0.65 i odpowiada 48 atrybutom. Taka wartość progowa pozwala na zachowanie znaczącej większości pacjentów w zbiorze, uzyskanie lepszego efektu poprzez jej zwiększenie, wiązałoby się ze znaczącym zmniejszeniem ilości pacjentów w zbiorze wynikowym.
patients_to_be_removed <- patient_last_results %>%
filter(number_of_tests < (ncol(df)-7) * threshold) %>%
select(PATIENT_ID)
df <- df %>% filter(PATIENT_ID %!in% patients_to_be_removed$PATIENT_ID)
Po usunięciu rekordów pacjentów, u których przeprowadzono mało badań, pozostało 354 unikalnych pacjentów.
Poniższy histogram prezentuje ilość kolumn, według ilości brakujących wartości badań w każdej kolumnie, biorąc pod uwagę wszystkie wyniki każdego z pacjentów. Dodatkowo nazwy kolumn zostały oznaczone według przynależności do jednej z grup badań (sekcja “Współwystępowanie badań”), lub opsiane wartością NONE, jesli nie należą do żadnej z nich.
Na powyższym wykresie możemy zaobserwować, że znacząca część badań została wykonana wszystkim pozostałym w zbiorze pacjentom. Dodatkowo, wszystkie testy z grupy biochemii krwi i morfologii zostały przeprowadzone u większości pacjentów.
W kolejnych krokach można rozważyć odrzucenie pacjentów, którzy nie mają wykonanych wszystkich testów w tych dwóch grupach.
W zwiazku z brakiem wykrytycyh preciwskazań, w tym kroku przeprowadzono scalanie wyników badań każdego pacjenta, według dnia jego wykonania, tj. wszystkie rekordy z danego dnia zostaną scalone w jeden rekord, który zawiera wszystkie, najbardziej aktualne wyniki z danego dnia.
df <- df %>%
mutate(RE_DATE = floor_date(RE_DATE, '1 day')) %>%
group_by(PATIENT_ID, RE_DATE) %>%
fill(everything()) %>%
summarise_all(last) %>%
ungroup()
Po tej transformacji, w zbiorze danych pozostało 1688 rekordów.
Powyższy histogram prezentuje ilość rekordów zawierających daną ilość wyników badań. Pomimo znacznej ilości rekordów zawierajacych tylko jeden wynik badania, obserwujemy wzrost w ilości rekordów zawierających ponad 40 wyników badań, w porównaniu do wyników przed agregacją.
Ta sekcja jest poświęcona analizie danych w zbiorze.
Poniższy zbiór wykresów przedstawia rozkład poszczególnych wyników badań, w zależności od rezultatu leczenia. Część wykresów jest nieczytelna przez występowanie wartości odstających (outlierów).
W niektórych wypadkach możemy zaobserwować istotne różnice między zbiorami pacjentów wyleczonych i zmarłych, są to między innymi parametry takie jak: albumin, hs_CRP, lymphoocytes_percent i monocythes_percent.
Poniższy wykres przedstawia wartość współczynnika korelacji Pearsona między wszystkimi parametrami liczbowymi w zbiorze. Parametry nominalne GENDER i OUTCOME, ze względu na to zę mają tylko dwie wartości, zostały zakodowane jako isMALE i isCURED. Dodatkowo, ze parametr 2019_nCov_detection ze względu na stałą wartość, został zamieniony na parametr has_nCOV_test, który indykuje czy w danym badaniu wykonano taki test.
cor_mat <- cor(
x = df %>%
mutate(isMALE = as.numeric(GENDER=="MALE"),
isCURED = as.numeric(OUTCOME=="CURED"),
has_nCOV_test = as.numeric(!is.na(`2019_nCov_detection`))) %>%
select(-c(1:8), -"2019_nCov_detection"),
use="pairwise.complete.obs"
)
cor_df = data.frame(round(cor_mat,2)) %>%
rownames_to_column() %>%
pivot_longer(-rowname, names_to="colname")
cor_plot <- ggplot(cor_df, aes(colname, rowname, fill=value)) +
geom_tile() +
scale_fill_gradient2() +
theme(axis.text.x=element_text(angle = 90, hjust = 0))
ggplotly(cor_plot)
Ponadto w poniższej tabeli zebrano 30 par atrybutów z największym współczynnikiem korelacji Pearsona.
| rowname | colname | value |
|---|---|---|
| MPV | P_LCR | 0.99 |
| INR | prothrombin_time | 0.99 |
| platelet_count | thrombocytocrit | 0.98 |
| HBsAg | interleukin_6 | 0.98 |
| direct_bilirubin | total_bilirubin | 0.98 |
| lymphocyte_percent | neutrophils_percent | -0.98 |
| procalcitonin | q_t_pallidum_abs | 0.95 |
| D_D_dimer | FDPs | 0.95 |
| P_LCR | PDW | 0.95 |
| MPV | PDW | 0.94 |
| ALT | interleukin_1β | 0.93 |
| lymphocyte_count | monocytes_count | 0.88 |
| serum_chloride | serum_sodium | 0.86 |
| eosinophil_count | eosinophils_percent | 0.86 |
| AAT | interleukin_1β | 0.86 |
| hematocrit | hemoglobin | 0.84 |
| MCH | MCV | 0.82 |
| indirect_bilirubin | total_bilirubin | 0.80 |
| interleukin_6 | interleukin_8 | 0.80 |
| RCDW | RCDW_SD | 0.79 |
| aPPT | prothrombin_time | 0.79 |
| monocytes_percent | neutrophils_percent | -0.77 |
| eGFR | urea | -0.77 |
| creatinine | urea | 0.75 |
| albumin | calcium | 0.74 |
| isCURED | neutrophils_percent | -0.73 |
| isCURED | lymphocyte_percent | 0.72 |
| neutrophils_count | neutrophils_percent | 0.71 |
| albumin | total_protein | 0.70 |
| lymphocyte_percent | neutrophils_count | -0.70 |
TODO
| attribute | estimate | p.value | conf.low | conf.high |
|---|---|---|---|---|
| neutrophils_percent | -0.7301461 | 0 | -0.7586392 | -0.6988654 |
| lymphocyte_percent | 0.7234883 | 0 | 0.6915912 | 0.7525691 |
| albumin | 0.6880859 | 0 | 0.6524294 | 0.7207028 |
| prothrombin_activity | 0.6547754 | 0 | 0.6084767 | 0.6966318 |
| hs_CRP | -0.6509896 | 0 | -0.6910468 | -0.6069460 |
| D_D_dimer | -0.6376192 | 0 | -0.6819778 | -0.5885867 |
| LDH | -0.6270327 | 0 | -0.6648056 | -0.5860615 |
| neutrophils_count | -0.6083675 | 0 | -0.6470960 | -0.5665074 |
| FDPs | -0.6042409 | 0 | -0.6689583 | -0.5304310 |
| AGE | -0.5761382 | 0 | -0.6071595 | -0.5433633 |
| calcium | 0.5703332 | 0 | 0.5257539 | 0.6117881 |
| platelet_count | 0.5419441 | 0 | 0.4952125 | 0.5855487 |
| monocytes_percent | 0.5415337 | 0 | 0.4947996 | 0.5851444 |
| eGFR | 0.4909936 | 0 | 0.4402769 | 0.5385870 |
| urea | -0.4841428 | 0 | -0.5321758 | -0.4330031 |
TODO
TODO
Ta sekcja poświęcona jest analizie długości hospitalizacji poszczególnych grup pacjentów.
TODO jak to zrobili w artykule odrzucając tylu pacjentów DECEASED
TODO
TODO
z czynnikami zakłocającymi
TODO
Ninejsza sekcja zawiera dodatkowe informacje o technicznych parametrach raportu
unique(c(.packages(), loadedNamespaces()))
## [1] "gridExtra" "plotly" "tibble" "broom" "purrr"
## [6] "ggplot2" "stringr" "lubridate" "dplyr" "tidyr"
## [11] "arules" "Matrix" "httr" "readxl" "stats"
## [16] "graphics" "grDevices" "utils" "datasets" "methods"
## [21] "base" "Rcpp" "highr" "cellranger" "compiler"
## [26] "pillar" "tools" "digest" "viridisLite" "jsonlite"
## [31] "evaluate" "lifecycle" "gtable" "lattice" "pkgconfig"
## [36] "rlang" "crosstalk" "curl" "yaml" "xfun"
## [41] "withr" "knitr" "htmlwidgets" "generics" "vctrs"
## [46] "grid" "tidyselect" "data.table" "glue" "R6"
## [51] "rmarkdown" "farver" "magrittr" "backports" "scales"
## [56] "htmltools" "ellipsis" "colorspace" "labeling" "stringi"
## [61] "lazyeval" "munsell" "crayon"